package com.mh.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mh.dto.R;
import com.mh.dto.vo.GroupApplyHandleVo;
import com.mh.dto.vo.GroupIntoVo;
import com.mh.dto.vo.GroupUserDto;
import com.mh.pojo.GroupInfo;
import com.mh.pojo.GroupUser;
import com.mh.service.GroupUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.*;

/**
 * 群组用户表(GroupUser)表控制层
 *
 * @author zmh
 * @since 2024-09-02 17:22:06
 */
@RestController
@Slf4j
@CrossOrigin
@RequestMapping("/groupUsers")
public class GroupUserController {
    /**
     * 服务对象
     */
    @Autowired
    private GroupUserService groupUserService;

    @Resource
    private RedisTemplate<String, List<String>> redisTemplate;

    /**
     * 获取指定用户的群组信息列表
     * @param userId 用户ID
     * @return `
     */
    @GetMapping("/getGroupList/{userId}")
    public R<List<GroupInfo>> getGroupList(@PathVariable String userId) {
        return groupUserService.getGroupList(userId);
    }

    /**
     * 群组申请的处理器
     * @param groupApplyHandleVo 群组ID,用户ID，处理操作（1-同意，3-拒绝）
     * @return ·
     */
    @PutMapping("/GroupApplyHandle")
    public R<String> GroupApplyHandle(@RequestBody GroupApplyHandleVo groupApplyHandleVo) {
        return groupUserService.GroupApplyHandle(groupApplyHandleVo);
    }

    /**
     * （获取群组申请 - 群主）获取指定用户的群组的所有申请（获取主动申请）
     * @param userId 群主ID
     * @return ·
     */
    @GetMapping("/getUserInfoOfApplyGroup/{userId}")
    public R<List<GroupUserDto>> getUserInfoOfApplyGroup(@PathVariable String userId) {
        return groupUserService.getUserInfoOfApplyGroup(userId);
    }

    /**
     *（获取群组申请 - 被邀请用户）获取指定用户所有被邀请（群组）记录Dto
     * @param userId 用户ID
     * @return ·
     */
    @GetMapping("/getBeInviteGroupInfo/{userId}")
    public R<List<GroupUserDto>> getBeInviteGroupInfo(@PathVariable String userId) {
        return groupUserService.getBeInviteGroupInfo(userId);
    }

    /**
     * 获取指定群组中的所有用户ID
     * @param groupId 群组ID
     * @return ·
     */
    @GetMapping("/getGroupUsers")
    public Map<String, List<String>> getGroupUsersData(@RequestParam String groupId) {
        // 取出Redis中所有以chat-group:开头的key
        Set<String> keys = redisTemplate.keys("chat-group:*");
        // 构建结构封装和返回数据
        Map<String, List<String>> maps = new HashMap<>();

        // 如果 keys 为空或没有匹配的键，返回空列表
        if (keys == null || keys.isEmpty()) {
            return maps;
        }

        // 遍历取出群组用户数据
        for (String key : keys) {
            if(("chat-group:"+groupId).equals(key)){
                // 获取 Redis 中对应 key 的用户集合
                List<String> userIds = redisTemplate.opsForValue().get(key);

                // 封装数据到 Map 中，key 为群组名称，value 为用户集合
                if (userIds != null) {
                    maps.put(groupId, new ArrayList<>(userIds));
                }
                break;
            }
        }
        return maps;
    }

    /**
     * 添加group_user表记录
     * @param groupIntoVo VO：群组ID, 用户ID，状态
     * @return ·
     */
    @PostMapping("/applyIntoGroup")
    R<String> groupInto(@RequestBody GroupIntoVo groupIntoVo){
        return groupUserService.groupInto(groupIntoVo);
    }

    /**
     * 邀请用户加入群组
     * @param groupId 群组ID
     * @param email 用户邮箱地址
     * @return ·
     */
    @GetMapping("/inviteUserIntoGroup/{groupId}/{email}")
    R<String> inviteUserIntoGroup(@PathVariable("groupId") String groupId, @PathVariable("email") String email){
        return groupUserService.inviteUserIntoGroup(groupId, email);
    }

    /**
     * 分页查询
     *
     * @param page 查询页数
     * @param size 一页显示条数
     * @return ·
     */
    @GetMapping("/page")
    public R<Page<GroupUser>> getAllByPage(int page, int size) {
        //执行查询
        return groupUserService.getAllByPage(page, size);
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R<GroupUser> selectOne(@PathVariable Serializable id) {
        return R.success(this.groupUserService.getById(id));
    }

    /**
     * 新增数据
     *
     * @param groupUser 实体对象
     * @return 新增结果
     */
    @PostMapping
    public R<String> insert(@RequestBody GroupUser groupUser) {
        return R.success(this.groupUserService.save(groupUser) + "");
    }

    /**
     * 修改数据
     *
     * @param groupUser 实体对象
     * @return 修改结果
     */
    @PutMapping
    public R<String> update(@RequestBody GroupUser groupUser) {
        return R.success(this.groupUserService.updateById(groupUser) + "");
    }

    /**
     * 删除数据
     *
     * @param id 主键结合
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public R<String> delete(@PathVariable("id") String id) {
        return R.success(this.groupUserService.removeById(id) + "");
    }
}

